package com.lyf.learn.atsgg.spring.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @AUTHOR LYF
 * @DATE 2022/6/7
 * @VERSION 1.0
 * @DESC
 */
@Component
@Aspect
public class LogAspect {

    //@LINK execution ---https://blog.csdn.net/loongshawn/article/details/72303040
    @Pointcut(value = "execution(* com.lyf.learn.atsgg.spring.aop.controller..*(..))")
    void pointCut(){}

    //https://blog.csdn.net/weixin_33676492/article/details/92388130
    /**
     * 由下列方式来定义或者通过 &&、 ||、 !、 的方式进行组合：
     *
     * execution：用于匹配方法执行的连接点；
     *
     * within：用于匹配指定类型内的方法执行；
     *
     * this：用于匹配当前AOP代理对象类型的执行方法；注意是AOP代理对象的类型匹配，这样就可能包括引入接口也类型匹配；
     *
     * target：用于匹配当前目标对象类型的执行方法；注意是目标对象的类型匹配，这样就不包括引入接口也类型匹配；
     *
     * args：用于匹配当前执行的方法传入的参数为指定类型的执行方法；
     *
     * @within：用于匹配所以持有指定注解类型内的方法；
     *
     * @target：用于匹配当前目标对象类型的执行方法，其中目标对象持有指定的注解；
     *
     * @args：用于匹配当前执行的方法传入的参数持有指定注解的执行；
     *
     * @annotation：用于匹配当前执行方法持有指定注解的方法；
     */
    //@Pointcut(value = "execution(* com.lyf.learn.atsgg.spring.aop.controller..*(..))")
    @Pointcut(value = "execution(* com.lyf.learn.atsgg.spring.aop.controller..*(..))) " +
                      "&& @annotation(com.lyf.learn.atsgg.spring.aop.annotation.CheckFile)")
    void pointCut2(){}

    @Pointcut(value = "@annotation(com.lyf.learn.atsgg.spring.aop.annotation.CheckFile)")
    void pointCut3(){}

    @Before("pointCut2()")
    void before2(){
        System.out.println("before2");
    }

//    @Before("pointCut()")
//    void before(JoinPoint joinPoint){
//        System.out.println(Arrays.toString(joinPoint.getArgs()));
//        System.out.println(joinPoint.getKind()+":"+joinPoint.getTarget()+":"+joinPoint.getThis());
//
//        Object targetObject = joinPoint.getTarget();
//        Class clazz = targetObject.getClass();
//
//
//        System.out.println("before");
//    }




}
